package com.gofaraway.service.student.左神算法课.v2;

/**
 * https://www.yuque.com/chenpeng-bmorg/pzpt8l/nwy89n8d43w0p3u8/edit?toc_node_uuid=MMx7zAIuOcUQBCkF
 *
 * @author ChenPeng
 * @date 2025/4/26 15:41
 */
public class Code02_WeiYunSuan {


    /**
     * 如何不用额外变量，交换两个变量的值
     * <p>
     * 解释： int a = 3;  int b = 4; 让 a = 4，b = 3
     *
     * @param a
     * @param b
     */
    public void swap(int a, int b) {
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
    }


    /**
     * 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数 根据 定律 ： N^N=0 解决
     */
    public int find(int[] arr) {
        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }
        return eor;
    }


    /**
     * 怎么把一个int类型的数，提取出最右侧的1出来
     */
    public static int bit1counts(int N) {
        return N & (~N + 1);
    }


    /**
     * 一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么 找到并打印这两种数
     * <p>
     * 利用 提取一个数最右侧的 1 做
     */
    public static void printOddTimesNums2(int[] arr) {

        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }

        //此时的 eor = 要求的第一个数 ^ 要求的第二个数

        int rightOne = bit1counts(eor);

        int onlyOne = 0;//eor‘

        for (int i = 0; i < arr.length; i++) {
            if ((arr[i] & rightOne) != 0) {
                onlyOne ^= arr[i];
            }
        }
        System.out.println(onlyOne + "" + (eor ^ onlyOne));
    }


    public static void main(String[] args) {
        int a = 9;
        System.out.println(bit1counts(a));
    }


}
